home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 107 < prev    next >
Text File  |  1995-08-13  |  61KB  |  1,728 lines

  1. C.S.M.P. Digest             Sat, 12 Aug 95       Volume 3 : Issue 107
  2.  
  3. Today's Topics:
  4.  
  5.         Clipping controls
  6.         Is a volume from server X mounted?
  7.         MDEF and PowerPC
  8.         Prefs in resource fork
  9.         TextBox & Transfer Mode?!
  10.         WOW. Was: Man, is image manipulation ugly in Pascal!
  11.         [ANN][PTR] Advanced Color Imaging for Toolbox Assistant
  12.  
  13.  
  14.  
  15. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  16. (pottier@clipper.ens.fr).
  17.  
  18. The digest is a collection of article threads from the internet newsgroups
  19. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  20. people who read news semi-regularly and want an archive of the discussions.
  21. If you don't know what a newsgroup is, you probably don't have access to
  22. it. Ask your systems administrator(s) for details. If you don't have access
  23. to news, you may still be able to post messages to the group by using a
  24. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  25. information).
  26.  
  27. Each issue of the digest contains one or more sets of articles (called
  28. threads), with each set corresponding to a 'discussion' of a particular
  29. subject.  The articles are not edited; all articles included in this digest
  30. are in their original posted form (as received by our news server at
  31. nef.ens.fr).  Article threads are not added to the digest until the last
  32. article added to the thread is at least two weeks old (this is to ensure that
  33. the thread is dead before adding it to the digest).  Article threads that
  34. consist of only one message are generally not included in the digest.
  35.  
  36. The digest is officially distributed by two means, by email and ftp.
  37.  
  38. If you want to receive the digest by mail, send email to listserv@ens.fr
  39. with no subject and one of the following commands as body:
  40.     help                                Sends you a summary of commands
  41.     subscribe csmp-digest Your Name     Adds you to the mailing list
  42.     signoff csmp-digest                 Removes you from the list
  43. Once you have subscribed, you will automatically receive each new
  44. issue as it is created.
  45.  
  46. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  47. Questions related to the ftp site should be directed to
  48. scott.silver@dartmouth.edu.
  49.  
  50. -------------------------------------------------------
  51.  
  52. >From 3gl21@qlink.queensu.ca (Gregory Lo)
  53. Subject: Clipping controls
  54. Date: Tue, 18 Jul 1995 00:14:10 -0400
  55. Organization: Queen's University
  56.  
  57. How do you go about drawing controls within a clipped area?
  58.  
  59. I set the clip region with ClipRect, but the controls only seem to obey
  60. the clipping some of the time.
  61.  
  62. What is the deal with SetClip and GetClip.  IM-I tells me that SetClip and
  63. GetClip don't actually set the ClipRgn itself, but rather make copies
  64. of/to it.  So, then how can one make use of these routines safely, and
  65. what effect does ClipRect have in conjunction with SetClip and GetClip?
  66.  
  67. GLo
  68.  
  69. - ---------------------------------------------------------
  70. Gregory Lo  GLo ?:^(>      <mailto:3gl21@qlink.queensu.ca>
  71. <mailto:log@declab.queensu.ca>      <mailto:greglo@io.org>
  72.  
  73. +++++++++++++++++++++++++++
  74.  
  75. >From dstone@chem.utoronto.ca (David Stone)
  76. Date: Wed, 19 Jul 1995 12:53:58 GMT
  77. Organization: University of Toronto Chemistry
  78.  
  79. In article <3gl21-1807950014110001@slip112.qlink.queensu.ca>,
  80. 3gl21@qlink.queensu.ca (Gregory Lo) wrote:
  81. > How do you go about drawing controls within a clipped area?
  82. > I set the clip region with ClipRect, but the controls only seem to obey
  83. > the clipping some of the time.
  84. > What is the deal with SetClip and GetClip.  IM-I tells me that SetClip and
  85. > GetClip don't actually set the ClipRgn itself, but rather make copies
  86. > of/to it.  So, then how can one make use of these routines safely, and
  87. > what effect does ClipRect have in conjunction with SetClip and GetClip?
  88. > GLo
  89. > -----------------------------------------------------------
  90. > Gregory Lo  GLo ?:^(>      <mailto:3gl21@qlink.queensu.ca>
  91. > <mailto:log@declab.queensu.ca>      <mailto:greglo@io.org>
  92.  
  93. GetClip gives you a duplicate of the ClipRgn so that, if you need to
  94. change the clipRgn you can then restore it, ie.
  95.  
  96. RgnHandle saveRgn;
  97. saveRgn = NewRgn();
  98. GetClip(&saveRgn);
  99. SetClip(specificRgn);           //      previously allocated and defined rgn
  100. //do some drawing
  101. SetClip(saveRgn);
  102.  
  103. This is useful if, say, you're drawing a graph and want to clip to the
  104. graph axes, but you still want window updates to occur outside this
  105. region..
  106.  
  107. GetClip(&saveRgn);   // clipRgn was initially the portRect
  108. ClipRect(&graphRect);
  109. DrawGraph();
  110. SetClip(saveRgn);
  111.  
  112. As far as the controls go, I don't know why you're having problems
  113. since you don't describe the symptoms.  Could be though a radio button
  114. with a title field that extends past the boundary of the clip region
  115. you're trying to set up, or else some CDEF that plays with the clip
  116. region internally for its own nefarious purposes!
  117.  
  118. Dave Stone
  119.  
  120. +++++++++++++++++++++++++++
  121.  
  122. >From 3gl21@qlink.queensu.ca (Gregory Lo)
  123. Date: Thu, 20 Jul 1995 08:54:08 -0400
  124. Organization: Queen's University
  125.  
  126. In article <dstone-190795085527@csgmac.chem.utoronto.ca>,
  127. dstone@chem.utoronto.ca (David Stone) wrote:
  128.  
  129. > GetClip gives you a duplicate of the ClipRgn so that, if you need to
  130. > change the clipRgn you can then restore it, ie.
  131. > RgnHandle saveRgn;
  132. > saveRgn = NewRgn();
  133. > GetClip(&saveRgn);
  134. > SetClip(specificRgn);           //      previously allocated and defined rgn
  135. > //do some drawing
  136. > SetClip(saveRgn);
  137. > This is useful if, say, you're drawing a graph and want to clip to the
  138. > graph axes, but you still want window updates to occur outside this
  139. > region..
  140. > GetClip(&saveRgn);   // clipRgn was initially the portRect
  141. > ClipRect(&graphRect);
  142. > DrawGraph();
  143. > SetClip(saveRgn);
  144.  
  145. Thanks, this helps a lot!  I didn't know that the Rgn you passed as an
  146. argument to GetClip() had to already be allocated with NewRgn().  I'm not
  147. sure about having to pass the pointer to a RgnHandle, though...
  148.  
  149. But, what about ClipRect() ???  Does it totally replace the existing clip
  150. region with a rectangle?  Does it add a rectangle to the clip region?
  151.  
  152. And are you still responsible for disposing of the Rgn you pass to SetClip() ??
  153. Does it copy the contents of your Rgn to the clip region?  Does is
  154. completely replace the clip region with your Rgn?  Does it merely replace
  155. the handle stored in the GrafPort with your handle, leaving the old clip
  156. region handle leaking?
  157.  
  158. > As far as the controls go, I don't know why you're having problems
  159. > since you don't describe the symptoms.  Could be though a radio button
  160. > with a title field that extends past the boundary of the clip region
  161. > you're trying to set up, or else some CDEF that plays with the clip
  162. > region internally for its own nefarious purposes!
  163.  
  164. I don't know if the CDEF is acting up, but what I do is call ClipRect(),
  165. and part of the control still draws outside of the clipped region. 
  166. Strange.  I usually do this drawing during while handling an update
  167. event.  I should check my code for other instances where I draw controls,
  168. or whatever.
  169.  
  170. GLo
  171.  
  172. - ---------------------------------------------------------
  173. Gregory Lo  GLo ?:^(>      <mailto:3gl21@qlink.queensu.ca>
  174. <mailto:log@declab.queensu.ca>      <mailto:greglo@io.org>
  175.  
  176. - ---BEGIN PGP PUBLIC KEY BLOCK-----
  177. Version: 2.3
  178.  
  179. mQA/Ai8+AVAAAAEBgMIk5CmBwL3pO1Nb164GoQsAImsTKFL5V9q/Gwdz8AJRrMoM
  180. DyCDCBZvUsNweh0gWQARAQABtCNHcmVnb3J5IExvIDwzZ2wyMUBxbGluay5xdWVl
  181. bnN1LmNhPrQmR3JlZ29yeSBMbyA8M2dsMjFAamVmZi1sYWIucXVlZW5zdS5jYT60
  182. IkdyZWdvcnkgTG8gPGxvZ0BkZWNsYWIucXVlZW5zdS5jYT4=
  183. =Hw55
  184. - ---END PGP PUBLIC KEY BLOCK-----
  185.  
  186. +++++++++++++++++++++++++++
  187.  
  188. >From larson@base.cs.ucla.edu (Christopher Larson)
  189. Date: 20 Jul 1995 15:48:53 GMT
  190. Organization: UCLA, Computer Science Department
  191.  
  192. In article <3gl21-2007950854090001@slip104.qlink.queensu.ca> 3gl21@qlink.queensu.ca writes:
  193. > [ ... ]
  194. >But, what about ClipRect() ???  Does it totally replace the existing clip
  195. >region with a rectangle?  Does it add a rectangle to the clip region?
  196.  
  197. ClipRect() replaces the clipRgn of the current GrafPort with a rectangular
  198. region described by the given Rect.
  199.  
  200. >And are you still responsible for disposing of the Rgn you pass to SetClip() ??
  201.  
  202. Yes.
  203.  
  204. >Does it copy the contents of your Rgn to the clip region?
  205.  
  206. Yes.
  207.  
  208. >Does is completely replace the clip region with your Rgn?
  209.  
  210. Yes. The new clipRgn will be _exactly_ the region you give ClipRgn(), not
  211. the intersection of the region you pass and the current clipRgn (or
  212. anything like that).
  213.  
  214. >Does it merely replace
  215. >the handle stored in the GrafPort with your handle, leaving the old clip
  216. >region handle leaking?
  217.  
  218. No. ClipRgn() changes the current clipRgn so that it describes the same
  219. region as the region you pass to ClipRgn(). (Try saying that five times
  220. fast ;-). After ClipRgn() returns, the region you passed in is yours to
  221. play with and dispose of with no further effect on the clipRgn (unless
  222. you call ClipRgn() again, of course). No leak.
  223.  
  224. >I don't know if the CDEF is acting up, but what I do is call ClipRect(),
  225. >and part of the control still draws outside of the clipped region. 
  226. >Strange.  I usually do this drawing during while handling an update
  227. >event.  I should check my code for other instances where I draw controls,
  228. >or whatever.
  229.  
  230. That is odd. Most of the CDEFs that I've seen (and all that I've written) set
  231. the clipping region to the intersection of the current clipping region with
  232. their control's rectangle before they do any drawing. This way, both the
  233. clipping region of the current port and the control's rectangle are respected.
  234. Is this one of the system's CDEFs or is it 3rd party?
  235.  
  236. Doing the control drawing during the update handling process shouldn't be a
  237. problem. All BeginUpdate() does is replace the clipping region with the
  238. intersection of the clipRgn and visRgn (so that drawing takes place only
  239. in the _visible_ portion of the window). This shouldn't be increasing the
  240. size of the clipRgn; it should only make it smaller so I don't think that's
  241. the problem.
  242.  
  243. --Chris
  244. _______________________________________________________________________________
  245. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  246. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  247. - -------------------------------------+---------------------------------------
  248. (Insert Disclaimer Here)               | Who's the man ridin' in the sun?
  249. UCLA Bruins--1995 NCAA Men's Basketball| Who's the man with the itchy gun?
  250.              National Champions (yea!) | Who's the man who kills for fun?
  251. Internet: larson@kingston.cs.ucla.edu  | Psycho Dad, Psycho Dad, PSYCHO DAD!
  252.  
  253. +++++++++++++++++++++++++++
  254.  
  255. >From dstone@chem.utoronto.ca (David Stone)
  256. Date: Fri, 21 Jul 1995 13:02:26 GMT
  257. Organization: University of Toronto Chemistry
  258.  
  259. In article <3gl21-2007950854090001@slip104.qlink.queensu.ca>,
  260. 3gl21@qlink.queensu.ca (Gregory Lo) wrote:
  261. > In article <dstone-190795085527@csgmac.chem.utoronto.ca>,
  262. > dstone@chem.utoronto.ca (David Stone) wrote:
  263. > > GetClip gives you a duplicate of the ClipRgn so that, if you need to
  264. > > change the clipRgn you can then restore it, ie.
  265. > > 
  266. > > RgnHandle saveRgn;
  267. > > saveRgn = NewRgn();
  268. > > GetClip(&saveRgn);
  269. > > SetClip(specificRgn);           //      previously allocated and defined rgn
  270. > > //do some drawing
  271. > > SetClip(saveRgn);
  272. ======snip======
  273. > Thanks, this helps a lot!  I didn't know that the Rgn you passed as an
  274. > argument to GetClip() had to already be allocated with NewRgn().  I'm not
  275. > sure about having to pass the pointer to a RgnHandle, though...
  276.  
  277. My mistake - I was going from memory and got confused with GetPort..
  278. GetClip(saveRgn);
  279.  
  280. > But, what about ClipRect() ???  Does it totally replace the existing clip
  281. > region with a rectangle?  Does it add a rectangle to the clip region?
  282.  
  283. It's a bit like calling RectRgn(specificRgn,&specificRect) before calling
  284. SetClip, but saves you the bother.
  285.  
  286. > And are you still responsible for disposing of the Rgn you pass to SetClip() ??
  287.  
  288. Yes
  289.  
  290. > Does it copy the contents of your Rgn to the clip region?  Does is
  291. > completely replace the clip region with your Rgn?  Does it merely replace
  292. > the handle stored in the GrafPort with your handle, leaving the old clip
  293. > region handle leaking?
  294.  
  295. Completely replaces it with a copy of your region
  296.  
  297. Dave Stone
  298.  
  299. ---------------------------
  300.  
  301. >From jms20@po.cwru.edu (John M. Sully)
  302. Subject: Is a volume from server X mounted?
  303. Date: Wed, 26 Jul 1995 09:59:11 -0500
  304. Organization: Case Western Reserve University
  305.  
  306. I've been stumped by this for a while so I'm hoping that someone might be
  307. able to help me.  
  308.  
  309. I am trying to write some code that will tell me if a volume from a
  310. specific AppleShare server is mounted.
  311. I'm not really concerned with which volume it is, just if is from the
  312. server I'm looking for.  The reason
  313. behind this is we have multiple servers that are acting as our campus
  314. software libraries and I am writing a
  315. launching program that will choose from these servers randomly.  I don't
  316. want to waste connections by 
  317. connecting to more than one server at a time, but I don't necessarily know
  318. all the volume names on each
  319. server (and I don't want to hardcode a list of 'known' volumes in the
  320. code...makes it difficult if we change
  321. things).  
  322.  
  323. What I have tried in the past is use PGHGetVInfo to get the vRefNum of
  324. each mounted volume and then
  325. call PBgetVolMountInfo on that vRefNum and look at the server name in the
  326. AFPVolMountInfo 
  327. record.  Unfortunately, PGGetVolMountInfo seems to crash the machine when
  328. called against
  329. local volumes (hard disks, etc) which is a little inconvenient.
  330.  
  331. Can anyone offer any suggestions?
  332.  
  333. later...
  334. John
  335.  
  336. +++++++++++++++++++++++++++
  337.  
  338. >From quinn@cs.uwa.edu.au (Quinn "The Eskimo!")
  339. Date: Thu, 27 Jul 1995 09:58:38 +0800
  340. Organization: Department of Computer Science, University of Western Australia
  341.  
  342. In article <jms20-2607950959110001@lit35332.lit.cwru.edu>,
  343. jms20@po.cwru.edu (John M. Sully) wrote:
  344.  
  345. >I am trying to write some code that will tell me if a volume from a
  346. >specific AppleShare server is mounted.
  347.  
  348. Why not just make an alias to each volume in turn and then call
  349. GetAliasInfo on it to see which server/zone it's from?
  350.  
  351. Share and Enjoy.
  352. --
  353. Quinn "The Eskimo!"      "Space army! I'd death ray my grandmother
  354.                           for a space army about now."
  355.  
  356. +++++++++++++++++++++++++++
  357.  
  358. >From jumplong@aol.com (Jump Long)
  359. Date: 29 Jul 1995 02:09:25 -0400
  360. Organization: America Online, Inc. (1-800-827-6364)
  361.  
  362. In article <jms20-2607950959110001@lit35332.lit.cwru.edu>,
  363. jms20@po.cwru.edu (John M. Sully) wrote:
  364.  
  365. >What I have tried in the past is use PGHGetVInfo to get the
  366. >vRefNum of each mounted volume and then call PBgetVolMountInfo
  367. >on that vRefNum and look at the server name in the
  368. >AFPVolMountInfo  record.  Unfortunately, PGGetVolMountInfo seems
  369. >to crash the machine when called against local volumes (hard
  370. >disks, etc) which is a little inconvenient.
  371.  
  372. As pointed out in the Tech Note "Inside Macintosh: Files - Errata", you
  373. have to initialize the ioNamePtr field in the parameter block you pass to
  374. PBGetVolMountInfoSize and PBGetVolMountInfo (that field was left out in
  375. IM: Files). If you don't initialize it to a nil pointer or point it to a
  376. full pathname pString, you may end up crashing the system with a bus error
  377. or an address error (or maybe just a hang).
  378.  
  379. - Jim Luther
  380.  
  381. ---------------------------
  382.  
  383. >From tina@Starbase.NeoSoft.COM (Tina Marie)
  384. Subject: MDEF and PowerPC
  385. Date: 12 Jul 1995 09:22:42 -0500
  386. Organization: NeoSoft Internet Services   +1 713 968 5800
  387.  
  388.  
  389. I've got some old code that uses a custom MDEF (not in a resource),
  390. by building a handle containing a JMP and then the address of the
  391. function.  This works great on 68K machines, but obviously crashes
  392. hard when I compile for PowerPC (it doesn't know what to do with
  393. the 68K JMP).  
  394.  
  395. So, short of doing the Right Thing and putting the MDEF in a resource
  396. (which I'd rather not do), how do I make this work on PowerPC? I
  397. don't think it's as easy as just changing the 68K JMP to a PPC JMP,
  398. is it??  I assume I have to make a proc pointer as well...but no
  399. matter what I do, it still crashes. 
  400.  
  401. E-mail is very much appreciated!
  402.  
  403. Tina Marie
  404. programmer, Kaetron Software
  405.  
  406. -- 
  407. "God uses longints"     -  Cecil H.
  408. In Fortran, God is real unless declaired integer.
  409.  
  410. http://starbase.neosoft.com/~tina
  411.  
  412. +++++++++++++++++++++++++++
  413.  
  414. >From jordanz@altura.com (Jordan Zimmerman)
  415. Date: Thu, 13 Jul 1995 16:22:07 -0700
  416. Organization: Altura Software, Inc.
  417.  
  418. In article <3u0lri$fh6@Starbase.NeoSoft.COM>, tina@Starbase.NeoSoft.COM
  419. (Tina Marie) wrote:
  420. > So, short of doing the Right Thing and putting the MDEF in a resource
  421. > (which I'd rather not do), how do I make this work on PowerPC? I
  422. > don't think it's as easy as just changing the 68K JMP to a PPC JMP,
  423. > is it??  I assume I have to make a proc pointer as well...but no
  424. > matter what I do, it still crashes. 
  425.  
  426. One solution is to put the address of a RoutineDescriptor instead of the
  427. 68K jump and hard address.
  428.  
  429. -- 
  430. Jordan Zimmerman, Altura Software
  431. home page: http://www.altura.com/jordanz/home.html
  432. Coming to you fast as lightning on a 9500/120!
  433.  
  434. +++++++++++++++++++++++++++
  435.  
  436. >From rmeadows@aol.com (Rmeadows)
  437. Date: 25 Jul 1995 13:04:15 -0400
  438. Organization: America Online, Inc. (1-800-827-6364)
  439.  
  440. This is how I set it up:
  441.  
  442. I create a type:
  443. typedef struct tJumpRecord {
  444. #if !__powerc
  445.  short instruction;     // JMP  function
  446.  void (*function)();
  447. #else
  448.  long     lea;    // LEA  PC+8,A0
  449.  short     movea_l;   // MOVEA.L (A0),A0
  450.  short     jmp;    // JMP  (A0)
  451.  UniversalProcPtr function;
  452. #endif // !__powerc
  453. } JumpRecord, **JumpHandle;
  454.  
  455. ...and then I use a macro to initialize the jump record, so that I can use
  456. the same code for PPC and 68k:
  457. #if !__powerc
  458.  #define mInitJumpRecord(jumpHdl, procPtr) { (**jumpHdl).instruction =
  459. 0x4EF9; \
  460.                  (**jumpHdl).function = procPtr;  \
  461.                 }
  462. #else
  463.  #define mInitJumpRecord(jumpHdl, univProc) { (**jumpHdl).lea =
  464. 0x41FA0006;  \
  465.                  (**jumpHdl).movea_l = 0x2050;  \
  466.                  (**jumpHdl).jmp = 0x4ED0;   \
  467.                  (**jumpHdl).function = univProc; \
  468.                 }
  469. #endif // !__powerc
  470.  
  471. This works for MDEFs and LDEFs, and probably just about any other xDEF.
  472.  
  473. HTH...
  474. randy
  475. FGM, Inc.
  476. meadowsr@fgm.com
  477.  
  478. ---------------------------
  479.  
  480. >From clive@ctwilson.demon.co.uk (Clive Wilson)
  481. Subject: Prefs in resource fork
  482. Date: Tue, 04 Jul 1995 21:45:41 -0200
  483. Organization: Chez Moi
  484.  
  485. Is there any easy way of having a small number of preferences stored in
  486. the resource fork of an application?
  487.  
  488. I'm using THINK Pascal and really don't want to have to have the hassle of
  489. hunting the Preferences folder for my prefs. In any case it's more robust
  490. having them located with their application.
  491.  
  492. If there is a way of doing this, I would be really grateful if someone
  493. could suggest some means of doing it.
  494.  
  495. Many thanks in anticipation,
  496.  
  497. Clive Wilson
  498.  
  499. +++++++++++++++++++++++++++
  500.  
  501. >From scullin@cello.cs.uiuc.edu (Will Scullin)
  502. Date: 05 Jul 1995 21:31:39 GMT
  503. Organization: University of Illinois at Urbana
  504.  
  505. In article <clive-0407952145410001@ctwilson.demon.co.uk> clive@ctwilson.demon.co.uk (Clive Wilson) writes:
  506.  
  507. > From: clive@ctwilson.demon.co.uk (Clive Wilson)
  508. > Is there any easy way of having a small number of preferences stored in
  509. > the resource fork of an application?
  510. > I'm using THINK Pascal and really don't want to have to have the hassle of
  511. > hunting the Preferences folder for my prefs. In any case it's more robust
  512. > having them located with their application.
  513.  
  514. Well... not necessarily. Applications that as used over AppleShare may
  515. not behave as expected if their preferences are stored in their resource
  516. fork, and if the software is updated, an updater application must be
  517. used to copy the resource.
  518.  
  519. Will
  520. -- 
  521. | Will Scullin                                  |
  522. | University of Illinois                        |
  523. | scullin@cs.uiuc.edu                           |
  524. | http://www-pablo.cs.uiuc.edu/~scullin/        |
  525.  
  526. +++++++++++++++++++++++++++
  527.  
  528. >From rodman@cyberspace.com (Paul J. Rodman)
  529. Date: Wed, 05 Jul 1995 18:14:16 -0700
  530. Organization: Marginal at best
  531.  
  532. In article <SCULLIN.95Jul5163139@cello.cs.uiuc.edu>,
  533. scullin@cello.cs.uiuc.edu (Will Scullin) wrote:
  534.  
  535. > > From: clive@ctwilson.demon.co.uk (Clive Wilson)
  536. > > 
  537. > > Is there any easy way of having a small number of preferences stored in
  538. > > the resource fork of an application?
  539. > > 
  540. > > I'm using THINK Pascal and really don't want to have to have the hassle of
  541. > > hunting the Preferences folder for my prefs. In any case it's more robust
  542. > > having them located with their application.
  543. > Well... not necessarily. Applications that as used over AppleShare may
  544. > not behave as expected if their preferences are stored in their resource
  545. > fork, and if the software is updated, an updater application must be
  546. > used to copy the resource.
  547.  
  548. Additionally, if the application is used over a network by more than one
  549. user at a time, the wheels might just fall off.
  550.  
  551. I would say that having your prefs stored in the "usual" place is (a) very
  552. robust and (b) very little hassle.  The code is just a few lines.
  553.  
  554. ____________________________________________________________
  555. Paul J. Rodman                         rodman@cyberspace.com
  556. ____________________________________________________________
  557.  
  558. +++++++++++++++++++++++++++
  559.  
  560. >From Richard Wesley <hawkfish@punchdeck.com>
  561. Date: 6 Jul 1995 03:14:08 GMT
  562. Organization: Punch Deck Consulting
  563.  
  564. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  565. >Is there any easy way of having a small number of preferences stored in
  566. >the resource fork of an application?
  567. >
  568.  
  569. Not recommended.  What if your app is on a server? Or a CD-ROM?!
  570.  
  571. >I'm using THINK Pascal and really don't want to have to have the hassle of
  572. >hunting the Preferences folder for my prefs. In any case it's more robust
  573. >having them located with their application.
  574. >
  575.  
  576. Why is it "more robust"?  You can't run the thing from read-only media
  577. and it can't be shared among multiple users.
  578.  
  579. What's so hard about:
  580.  
  581. CONST 
  582.  
  583. STRn_FileNames = 128;
  584. kPrefsFileName = 1;
  585. kPrefsCreator = 'mypr';
  586. kPrefsFileType = 'myap'; { Don't call it 'pref'!  See develop article.}
  587.  
  588. VAR
  589.  
  590. e : OSErr;
  591. fileName : Str255;
  592. spec : FSSpec;
  593. fRefNum : Integer;
  594.  
  595. BEGIN
  596.  
  597. GetIndString (fileName, STRn_FileNames, kPrefsFileName);
  598. e := FindFolder (kOnSystemDisk, kPreferencesFolder, kCreateFolder, spec.vRefNum, spec.parID);
  599. e := FSMakeFSSpec (spec.vRefNum, spec.parID, fileName, spec);
  600. IF (e <> noErr) THEN
  601.     e := FSpCreate (spec, kPrefsCreator, kPrefsFileType, smDefaultScript);
  602. fRefNum := FSpOpenResFile (spec, fsRdWrPerm);
  603.  
  604. END;
  605.  
  606. >If there is a way of doing this, I would be really grateful if someone
  607. >could suggest some means of doing it.
  608.  
  609. Try the above.  Apologies if my PASCAL is a bit rusty...
  610.  
  611. - rmgw
  612.  
  613. http://www.punchdeck.com/hawkfish/Resume.html
  614.  
  615. - --------------------------------------------------------------------------
  616. Richard Wesley  hawkfish@punchdeck.com | "'Hand it round first, and cut it
  617. Punch Deck Consulting pnchdeck@aol.com |  afterwards.'" - Lewis Carroll,
  618.      Macintosh Software Development    |    "Through the Looking Glass"
  619. - --------------------------------------------------------------------------
  620.  
  621.  
  622.  
  623. +++++++++++++++++++++++++++
  624.  
  625. >From nick+@pitt.edu ( nick.c )
  626. Date: 6 Jul 1995 13:34:06 GMT
  627. Organization: The Pitt, Chemistry
  628.  
  629. In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  630. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  631.  
  632. >Is there any easy way of having a small number of preferences stored in
  633. >the resource fork of an application?
  634. >
  635. >I'm using THINK Pascal and really don't want to have to have the hassle of
  636. >hunting the Preferences folder for my prefs. In any case it's more robust
  637. >having them located with their application.
  638.  
  639.  
  640.  
  641.     Hmmm... your apps resource fork is a good place to keep a
  642.       read only copy of your default preferences, then just
  643.       copy it whole into your apps pref file on file creation,
  644.       but I would not suggest keeping user prefs there.
  645.  
  646.     You increase the chance of corrupting the application, some
  647.       folks lock their apps to reduce this risk and so will have
  648.       problems when you try and write to it, you can't save 
  649.       preferences on a CD rom or locked remote server, or worse
  650.       you can change preferences for your whole work group.
  651.  
  652.     I'd stick with the pref file if possible.  There was an article
  653.       re: pref file propriety and eg. code in develop 18.  Some
  654.       folks didn't quite agree with all the authors opinions on
  655.       what was "the right way" to do prefs, but the code and 
  656.       general discussion should be useful (you can DL eForm
  657.       copies of develop from ftp.support.apple.com).  Luck,
  658.  
  659.  
  660.  ---------------------= Nicholas C. DeMello =--------------------
  661.  
  662.  Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
  663.    eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
  664.       CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
  665.      http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
  666.                     
  667.  
  668. +++++++++++++++++++++++++++
  669.  
  670. >From jimnash@his.com (Jim Nash)
  671. Date: 6 Jul 1995 15:14:18 GMT
  672. Organization: SRS
  673.  
  674. In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  675. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  676.  
  677. > Is there any easy way of having a small number of preferences stored in
  678. > the resource fork of an application?
  679. > I'm using THINK Pascal and really don't want to have to have the hassle of
  680. > hunting the Preferences folder for my prefs. In any case it's more robust
  681. > having them located with their application.
  682.  
  683. Here is example code for accessing a preference file in the system
  684. folder.  It is specialized to my application so you will have to delete
  685. unwanted code and references to data structures.
  686.  
  687.  function OpenPrefFile (name: Str255): integer;
  688. {Gets user preference file from the preferences folder in the System folder}
  689. {The preferences are strings in which a word is followed by a parameter list}
  690.   var
  691.    err: OSErr;
  692.    vRef, refnum: integer;
  693.    dirID: longint;
  694.    spec: FSSpec;
  695.  begin
  696.   with user^ do begin
  697.    err := FindFolder(kOnsystemDisk, kPreferencesFolderType, kCreateFolder,
  698. vRef, DirID);
  699.    if err = noErr then
  700.     err := FSMakeFSSpec(vRef, dirID, name, spec);
  701.    if (err = noErr) or (err = -43) then begin
  702.     refnum := FSpOpenResFile(spec, fsCurPerm);
  703.     if refnum < 0 then begin
  704.      FSpCreateResFile(spec, creator_OSname, 'xxxx', iuSystemScript);
  705.      err := ResError;
  706.      if err <> noErr then begin
  707.       err := FSpCreate(spec, creator_OSname, 'xxxx', iuSystemScript);
  708.       FSpCreateResFile(spec, creator_OSname, 'xxxx', iuSystemScript);
  709.       err := ResError;
  710.      end;
  711.      refnum := FSpOpenResFile(spec, fsCurPerm);
  712.     end;
  713.    end;
  714.   end;
  715.   OpenPrefFile := refnum;
  716.  end;
  717.  
  718.  
  719.  procedure GetConfigFile;
  720.   const
  721.    name = 'Synapse Configuration';
  722.   var
  723.    err: OSErr;
  724.    count, i, j, refnum, index: integer;
  725.    sp: StringHandle;
  726.    str, wrd: Str255;
  727.  begin
  728.   refnum := OpenPrefFile(name);
  729.   if refnum > 0 then begin
  730.    count := CountResources('xxxx');
  731.    for i := 1 to count do begin
  732.     sp := StringHandle(GetIndResource('xxxx', i));
  733.     if sp <> nil then begin
  734.      str := sp^^;
  735.      ReleaseResource(handle(sp));
  736.      GetNextWord(str, wrd);
  737.      if wrd = 'Shutter' then begin
  738.       GetComInteger(str, j);
  739.       user^.ImgOpt.useShutterType := j;
  740.      end;
  741.      if wrd = 'filterZero' then begin
  742.       GetComInteger(str, j);
  743.       user^.ImgOpt.filterZero := j;
  744.      end;
  745.      if wrd = 'filterOffset' then begin
  746.       GetComInteger(str, j);
  747.       user^.ImgOpt.filterOffset := j;
  748.      end;
  749.     end;
  750.    end;
  751.   end;
  752.  end;
  753.  
  754.  
  755.  procedure PutConfigFile;
  756.   const
  757.    name = 'Synapse Configuration';
  758.   var
  759.    err: OSErr;
  760.    index, count, i, refnum: integer;
  761.    sp: StringHandle;
  762.  
  763.   procedure MyAddStrResource (str: Str255);
  764.    var
  765.     sp: StringHandle;
  766.   begin
  767.    sp := StringHandle(NewHandle(length(str) + 1));
  768.    sp^^ := str;
  769.    index := index + 1;
  770.    AddResource(handle(sp), 'xxxx', index, str);
  771.    err := ResError;
  772.   end;
  773.  
  774.  begin
  775.   refnum := OpenPrefFile(name);
  776.   if refnum > 0 then begin
  777.    count := CountResources('xxxx');
  778.    for i := 1 to count do begin
  779.     sp := StringHandle(GetIndResource('xxxx', i));
  780.     err := ResError;
  781.     if sp <> nil then begin
  782.      RmveResource(handle(sp));
  783.      err := ResError;
  784.     end;
  785.    end;
  786.    index := 127;
  787.    MyAddStrResource(concat('Shutter  ', itos(user^.ImgOpt.useShutterType)));
  788.    MyAddStrResource(concat('filterZero  ', itos(user^.ImgOpt.filterZero)));
  789.    MyAddStrResource(concat('filterOffset  ', itos(user^.ImgOpt.filterOffset)));
  790.   end;
  791.  end;
  792.  
  793. Good Luck.
  794.  
  795. - Jim
  796.  
  797. ____________________________________________________________________
  798. James W. Nash, Synergistic Research Systems
  799. 4409 Mahan Court, Silver Spring, MD 20906, USA
  800. (301) 942-6601, fax: (301) 942-6656
  801. ____________________________________________________________________
  802.  
  803. +++++++++++++++++++++++++++
  804.  
  805. >From hubauer@telerama.lm.com (Bill Hubauer)
  806. Date: Thu, 06 Jul 1995 23:00:17 -0400
  807. Organization: MSA
  808.  
  809. In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  810. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  811.  
  812. > Is there any easy way of having a small number of preferences stored in
  813. > the resource fork of an application?
  814. > I'm using THINK Pascal and really don't want to have to have the hassle of
  815. > hunting the Preferences folder for my prefs. In any case it's more robust
  816. > having them located with their application.
  817. > If there is a way of doing this, I would be really grateful if someone
  818. > could suggest some means of doing it.
  819. > Many thanks in anticipation,
  820.  
  821.  
  822. Maybe I'm silly, but this is how I (and most everyone I work with) view
  823. resources as preferences:
  824.  
  825. >From exprience, I do not trust the resource manager to write resources.
  826. Anytime I have written a program that writes resources (for preferences or
  827. whatever), The resource fork has eventually become corrupted.  (Have you
  828. ever had a tech support person tell you to "try trashing your prefs and
  829. restart"?)
  830.  
  831. I view resources as READ ONLY.  I would strongly recomend storing your
  832. preferences in the data fork.
  833.  
  834. Bill Hubauer
  835. MSA
  836.  
  837. +++++++++++++++++++++++++++
  838.  
  839. >From mouser@zercom.net (Martin-Gilles Lavoie)
  840. Date: 7 Jul 1995 12:35:12 GMT
  841. Organization: zercom technologies inc.
  842.  
  843. In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  844. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  845.  
  846. > Is there any easy way of having a small number of preferences stored in
  847. > the resource fork of an application?
  848. > I'm using THINK Pascal and really don't want to have to have the hassle of
  849. > hunting the Preferences folder for my prefs. In any case it's more robust
  850. > having them located with their application.
  851. > If there is a way of doing this, I would be really grateful if someone
  852. > could suggest some means of doing it.
  853. > Many thanks in anticipation,
  854. > Clive Wilson
  855.  
  856. Storing prefs in your app would be unadvisable for many reasons.  Those at the top of my head are that the user may be running the software off a locked volume, or a shared environement.  Shall the user's machine freeze for some reason while your software is playing with itself may cause some irreparable dammages to the application (AND preferences data), forcing the user to re-install the app and reset the preferences (no matter how small prefs are, I've noted users hate having to set them again).
  857.  
  858. Here's code you can use to easilly locate a pref file in the preferences folder:
  859.  
  860.         OSErr           osErr           =   noErr;
  861.         FSSpec          prefFileSpecs;
  862.         short           foundVRefNum    =   0;
  863.         long            foundDirID      =   0;
  864.  
  865.         osErr   =   FindFolder( kOnSystemDisk,
  866.                                 kPreferencesFolderType,
  867.                                 kCreateFolder,
  868.                                 &foundVRefNum,
  869.                                 &foundDirID);
  870.         
  871.         if (osErr == noErr) {
  872.             
  873.             osErr = FSMakeFSSpec(   foundVRefNum,
  874.                                     foundDirID,
  875.                                     (unsigned char*) "\My Pref File Name",
  876.                                     &prefFileSpecs);
  877.         }
  878.  
  879.             
  880. At this point, all you have to do is open your pref file resource fork with
  881.  
  882.     osErr = FSpOpenResFile(&prefFileSpecs, fsCurPerm);
  883.  
  884. and you've got your prefs at hand.
  885. -- 
  886. Martin-Gilles Lavoie
  887.  
  888. MPW: Because life is too complicated for CodeWarrior.
  889. --MGL
  890.  
  891. +++++++++++++++++++++++++++
  892.  
  893. >From devon@apple.com (Devon Hubbard)
  894. Date: Fri, 07 Jul 1995 13:40:08 -0700
  895. Organization: Apple Computer
  896.  
  897. In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  898. clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  899.  
  900. > Is there any easy way of having a small number of preferences stored in
  901. > the resource fork of an application?
  902.  
  903. Are you asking for details on how to add resources to your application's
  904. rsrc fork while it's running?
  905.  
  906. > I'm using THINK Pascal and really don't want to have to have the hassle of
  907. > hunting the Preferences folder for my prefs. In any case it's more robust
  908. > having them located with their application.
  909.  
  910. Saving preferences externally should not be considered a hassle, it should
  911. be considered a requirement if you have user preferences.  Is your app
  912. never going to be run from a server that might have read-only access on
  913. it?  Is you app never going to be used in an educational environment?  Is
  914. your app never  going to be on a drive someone is backing up with
  915. utilities like Retrospect?  There's more I'm sure.  If you can answer yes
  916. to any of those, then go right ahead and save your prefs in the
  917. application itself.  Among the many reasons why you should use the
  918. Preferences folder, by two favorite are:
  919.  
  920. 1. Backup utilities won't be saving your entire application every night
  921. because the mod date on it is constantly being updated because prefs are
  922. being saved in it.
  923. 2. Upgrading to newer versions of your software don't wipe out the users
  924. preferences they had setup in the earlier version (unless of course
  925. preference data structures changed or something like that).
  926.  
  927. > If there is a way of doing this, I would be really grateful if someone
  928. > could suggest some means of doing it.
  929.  
  930. Assuming you're familiar with creating handles, simply call AddResource()
  931. on it making sure the current res file is your app's (which it will be
  932. unless you've changed it).  Do a Get1Resource() on the pref type you
  933. created, and if it's not there, create the data handle and call
  934. AddResource() on it.  It's a good idea to do a CurResFile() followed
  935. sometime later by a UpdateResFile() if you've created a new resource; to
  936. make sure it's written back to disk.
  937.  
  938. If you have questions about the specifics of any of this, I'd be glad to help.
  939.  
  940. dEVoN
  941.  
  942. - ------------------------------------------------------------------------
  943. Devon Hubbard                                                Silicon Pilot
  944. devon@apple.com               Apple Guide Team         Apple Computer, Inc
  945.  
  946. +++++++++++++++++++++++++++
  947.  
  948. >From peter@adi.co.nz (Peter Bromley)
  949. Date: Sat, 08 Jul 1995 18:32:13 +1200
  950. Organization: ADInstruments
  951.  
  952. In article <hubauer-0607952300170001@hubauer.slip.lm.com>,
  953. hubauer@telerama.lm.com (Bill Hubauer) wrote:
  954.  
  955. > In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  956. > clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  957. > > Is there any easy way of having a small number of preferences stored in
  958. > > the resource fork of an application?
  959. > > 
  960. > > I'm using THINK Pascal and really don't want to have to have the hassle of
  961. > > hunting the Preferences folder for my prefs. In any case it's more robust
  962. > > having them located with their application.
  963. > > 
  964. > > If there is a way of doing this, I would be really grateful if someone
  965. > > could suggest some means of doing it.
  966. > > 
  967. > > Many thanks in anticipation,
  968. > Maybe I'm silly, but this is how I (and most everyone I work with) view
  969. > resources as preferences:
  970.  
  971. Yes - very silly. You should treat the application as writable for
  972. registration purposes only - although some applications I know dont even
  973. try that either! The application could be locked or sharable or located on
  974. a locked volume. No writee!
  975.  
  976. The place for preferences is the preferences file, the place for the
  977. preferences file is in the preferences folder, and you dont create one
  978. until the user changes a preference!!!
  979.  
  980. > From exprience, I do not trust the resource manager to write resources.
  981. > Anytime I have written a program that writes resources (for preferences or
  982. > whatever), The resource fork has eventually become corrupted.  (Have you
  983. > ever had a tech support person tell you to "try trashing your prefs and
  984. > restart"?)
  985.  
  986. Preference file resource forks get corrupted for one reason!!! Programmers
  987. forget to call
  988.  
  989.         ***UpdateResFile***
  990.  
  991. after writing the resource, and sooner or later (when your Mac dies - for
  992. whatever reason) the preferences file is dead in the water! UpdateResFile
  993. is really essential if you want the resource map in the file to match the
  994. resource map in memory.
  995.  
  996. > I view resources as READ ONLY.....
  997.  
  998. Only because you're paranoid about trashed preferences files. Hell,
  999. resources used to make up 90% of early data files, we still store lots of
  1000. thing in resources in ours.
  1001.  
  1002. > ....  I would strongly recomend storing your
  1003. > preferences in the data fork.
  1004.  
  1005. Its easier and more standard to use resources for things like preferences
  1006. but, hey, if you want to use the Data Fork, go for it.
  1007.  
  1008. -- 
  1009. Peter Bromley                                  (peter@adi.co.nz)
  1010. ADInstruments, Dunedin, New Zealand            
  1011.  
  1012. +++++++++++++++++++++++++++
  1013.  
  1014. >From chrisman@ucdmath.ucdavis.edu (Mark Chrisman)
  1015. Date: Sun, 09 Jul 1995 05:45:57 -0700
  1016. Organization: University of California, Davis
  1017.  
  1018. In article <hubauer-0607952300170001@hubauer.slip.lm.com>,
  1019. hubauer@telerama.lm.com (Bill Hubauer) wrote:
  1020.  
  1021. > From exprience, I do not trust the resource manager to write resources.
  1022. > Anytime I have written a program that writes resources (for preferences or
  1023. > whatever), The resource fork has eventually become corrupted.  (Have you
  1024. > ever had a tech support person tell you to "try trashing your prefs and
  1025. > restart"?)
  1026.  
  1027. Yes, and it really annoys me, because it's nothing more than bad
  1028. programming.  A program should detect the error and trash the prefs
  1029. automatically.  And the error-checking should be there whether you're
  1030. using a data fork or a resource fork.
  1031.  
  1032. -- 
  1033. Mark Chrisman
  1034.  
  1035. +++++++++++++++++++++++++++
  1036.  
  1037. >From chrisman@ucdmath.ucdavis.edu (Mark Chrisman)
  1038. Date: Sun, 09 Jul 1995 05:47:59 -0700
  1039. Organization: University of California, Davis
  1040.  
  1041. In article <mouser-0707950819520001@204.191.6.123>, mouser@zercom.net
  1042. (Martin-Gilles Lavoie) wrote:
  1043.  
  1044. > Storing prefs in your app would be unadvisable for many reasons....
  1045.  
  1046. Here's another reason:  would you rather back up a 2 Meg application or a
  1047. 2 K preference file?
  1048.  
  1049. -- 
  1050. Mark Chrisman
  1051.  
  1052. +++++++++++++++++++++++++++
  1053.  
  1054. >From jimnash@his.com (Jim Nash)
  1055. Date: 9 Jul 1995 19:03:41 GMT
  1056. Organization: SRS
  1057.  
  1058. In article <peter-0807951832130001@adi008.adi.co.nz>, peter@adi.co.nz
  1059. (Peter Bromley) wrote:
  1060.  
  1061. > Its easier and more standard to use resources for things like preferences
  1062. > but, hey, if you want to use the Data Fork, go for it.
  1063.  
  1064. If you are using a separate file for preferences it makes sence to use the
  1065. data fork, but I have used both on different occations.  I used the data
  1066. fork for duplicating an exact image of a binary data structure.  It takes
  1067. five lines to do this:
  1068.  
  1069.   if size or version number changed:
  1070.     delete old
  1071.     create new
  1072.   open
  1073.   write
  1074.   close
  1075.  
  1076. I used string resources when I wanted the preference file to be forward
  1077. and backward compatible with different versions of my program.  This was
  1078. more complicated to write, so I wrote a small set of procedures to make it
  1079. easy.  Then I store value pairs (name = value).
  1080.  
  1081. - Jim
  1082.  
  1083. ____________________________________________________________________
  1084. James W. Nash, Synergistic Research Systems
  1085. 4409 Mahan Court, Silver Spring, MD 20906, USA
  1086. (301) 942-6601, fax: (301) 942-6656
  1087. ____________________________________________________________________
  1088.  
  1089. +++++++++++++++++++++++++++
  1090.  
  1091. >From sw@network-analysis-ltd.co.uk (Sak Wathanasin)
  1092. Date: Thu, 13 Jul 95 00:15:39 +0100
  1093. Organization: Network Analysis Ltd
  1094.  
  1095.  
  1096. In article <hubauer-0607952300170001@hubauer.slip.lm.com> 
  1097. (comp.lang.pascal.mac,comp.sys.mac.programmer.misc,comp.sys.mac.programmer.hel
  1098. p), hubauer@telerama.lm.com (Bill Hubauer) writes:
  1099.  
  1100. > >From exprience, I do not trust the resource manager to write resources.
  1101. > Anytime I have written a program that writes resources (for preferences or
  1102. > whatever), The resource fork has eventually become corrupted.  (Have you
  1103. > ever had a tech support person tell you to "try trashing your prefs and
  1104. > restart"?)
  1105.  
  1106. Oh, c'mon; prefs files get trashed because some appls leave the prefs
  1107. files open and in the event of a crash any open file has a good
  1108. chance of being trashed. There's no law that says that you *must*
  1109. leave the prefs file open - you can read in the prefs, close the
  1110. file, and re-open it when the user changes something. The data fork
  1111. can get trashed in just the same way...
  1112.  
  1113. Sak Wathanasin
  1114. Network Analysis Limited
  1115. 178 Wainbody Ave South, Coventry CV3 6BX, UK
  1116.  
  1117. Internet: sw@network-analysis-ltd.co.uk 
  1118. uucp:     ...!eu.britain.net!nan!sw                       AppleLink: NAN.LTD
  1119. Phone: (+44) 1203 419996 Mobile:(+44) 850 587411  Fax: (+44) 1203 690690
  1120.  
  1121. +++++++++++++++++++++++++++
  1122.  
  1123. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  1124. Date: Sun, 16 Jul 1995 15:34:17 -0700
  1125. Organization: BW Software
  1126.  
  1127. In article <100338.2k5ha1@Xe.network-analysis-ltd.co.uk>,
  1128. sw@network-analysis-ltd.co.uk wrote:
  1129.  
  1130. > In article <hubauer-0607952300170001@hubauer.slip.lm.com> 
  1131. > (comp.lang.pascal.mac,comp.sys.mac.programmer.misc,comp.sys.mac.programmer.hel
  1132. > p), hubauer@telerama.lm.com (Bill Hubauer) writes:
  1133. > > >From exprience, I do not trust the resource manager to write resources.
  1134. > > Anytime I have written a program that writes resources (for preferences or
  1135. > > whatever), The resource fork has eventually become corrupted.  (Have you
  1136. > > ever had a tech support person tell you to "try trashing your prefs and
  1137. > > restart"?)
  1138. > Oh, c'mon; prefs files get trashed because some appls leave the prefs
  1139. > files open and in the event of a crash any open file has a good
  1140. > chance of being trashed. There's no law that says that you *must*
  1141. > leave the prefs file open - you can read in the prefs, close the
  1142. > file, and re-open it when the user changes something. The data fork
  1143. > can get trashed in just the same way...
  1144.  
  1145.  
  1146.      I agree.  I've used the resource fork for my prefs and have yet to
  1147. see anything corrupted.  On top of what was mentioned above, I notice some
  1148. people (still) have a problem with locking handles; even though just about
  1149. every tech note and book stresses it.  Try to be neat and tidy (i.e.
  1150. proper error checking and use of handles and pointers) and you won't have
  1151. these problems.
  1152. Nyah nyah...
  1153.  
  1154. -- 
  1155. "Don't flip me off!  I'll have you fuckin' killed!" - True Romance
  1156. Eric A. Drumbor
  1157. BW Software
  1158.  
  1159. +++++++++++++++++++++++++++
  1160.  
  1161. >From nagle@netcom.com (John Nagle)
  1162. Date: Mon, 17 Jul 1995 01:31:38 GMT
  1163. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1164.  
  1165. ericd@ra.nilenet.com (Eric A. Drumbor) writes:
  1166. >In article <100338.2k5ha1@Xe.network-analysis-ltd.co.uk>,
  1167. >sw@network-analysis-ltd.co.uk wrote:
  1168. >> In article <hubauer-0607952300170001@hubauer.slip.lm.com> 
  1169. >> (comp.lang.pascal.mac,comp.sys.mac.programmer.misc,comp.sys.mac.programmer.hel
  1170. >> p), hubauer@telerama.lm.com (Bill Hubauer) writes:
  1171. >> 
  1172. >> > >From exprience, I do not trust the resource manager to write resources.
  1173. >> > Anytime I have written a program that writes resources (for preferences or
  1174. >> > whatever), The resource fork has eventually become corrupted.  (Have you
  1175. >> > ever had a tech support person tell you to "try trashing your prefs and
  1176. >> > restart"?)
  1177.  
  1178.      I assume you mean the resource fork of a Preferences file, not the
  1179. resource fork of the application itself.  Writing into an application's
  1180. file is obnoxious; it might be locked, it might be on a read-only
  1181. medium, or virus protection software might think a virus is doing it.
  1182. And if anything goes wrong, the application gets trashed.
  1183.  
  1184.                                         John Nagle
  1185.  
  1186. +++++++++++++++++++++++++++
  1187.  
  1188. >From msmail.laelg@tsod.lmig.com (Glenn T. Lael)
  1189. Date: Tue, 18 Jul 1995 08:44:27 -0500
  1190. Organization: Liberty Mutual I/S
  1191.  
  1192.  
  1193. > In article <hubauer-0607952300170001@hubauer.slip.lm.com>,
  1194. > hubauer@telerama.lm.com (Bill Hubauer) wrote:
  1195. > > In article <clive-0407952145410001@ctwilson.demon.co.uk>,
  1196. > > clive@ctwilson.demon.co.uk (Clive Wilson) wrote:
  1197. > > 
  1198. > > > Is there any easy way of having a small number of preferences stored in
  1199. > > > the resource fork of an application?
  1200. > > > 
  1201. > > > I'm using THINK Pascal and really don't want to have to have the hassle of
  1202. > > > hunting the Preferences folder for my prefs. In any case it's more robust
  1203. > > > having them located with their application.
  1204. > > > 
  1205. > > > If there is a way of doing this, I would be really grateful if someone
  1206. > > > could suggest some means of doing it.
  1207. > > > 
  1208. > > > Many thanks in anticipation,
  1209. > > 
  1210. > > 
  1211. > > Maybe I'm silly, but this is how I (and most everyone I work with) view
  1212. > > resources as preferences:
  1213.        
  1214.  
  1215. As someone said somewhere else in this thread, preferences should go in
  1216. the preference file... but of course you knew that already ;,)
  1217.  
  1218. Take a look at Develop magazine, issue 18 (June 1994).  There is an
  1219. article by Gary Woodcock entitled "The Right way to Implement Preferences
  1220. Files".
  1221.  
  1222. The source library he talks about is probabily avaliable at http://
  1223. www.info.apple.com.
  1224.  
  1225. Hope this helps.
  1226.  
  1227. Glenn
  1228.  
  1229. Glenn T. Lael
  1230. Liberty Mutual Group
  1231. Portsmouth, NH
  1232.  
  1233. e-mail: msmail.laelg@tsod.lmig.com
  1234.  
  1235. legaleese-> The opinions expressed hearin do not represent those of my employer.
  1236.  
  1237.  
  1238. Mister Blobbo Sez:
  1239.    3Remember, kids: Time is just Nature9s way of keeping
  1240.      everything from happening at once.2
  1241.  
  1242. +++++++++++++++++++++++++++
  1243.  
  1244. >From wombat@claris.com (Scott Lindsey)
  1245. Date: Sat, 22 Jul 1995 02:06:15 -0800
  1246. Organization: Claris Corp., Vancouver WA
  1247.  
  1248. In article <100338.2k5ha1@Xe.network-analysis-ltd.co.uk>,
  1249. sw@network-analysis-ltd.co.uk wrote:
  1250.  
  1251. > In article <hubauer-0607952300170001@hubauer.slip.lm.com> 
  1252. > (comp.lang.pascal.mac,comp.sys.mac.programmer.misc,comp.sys.mac.programmer.hel
  1253. > p), hubauer@telerama.lm.com (Bill Hubauer) writes:
  1254. > > >From exprience, I do not trust the resource manager to write resources.
  1255. > > Anytime I have written a program that writes resources (for preferences or
  1256. > > whatever), The resource fork has eventually become corrupted.  (Have you
  1257. > > ever had a tech support person tell you to "try trashing your prefs and
  1258. > > restart"?)
  1259. > Oh, c'mon; prefs files get trashed because some appls leave the prefs
  1260. > files open and in the event of a crash any open file has a good
  1261. > chance of being trashed. There's no law that says that you *must*
  1262. > leave the prefs file open - you can read in the prefs, close the
  1263. > file, and re-open it when the user changes something. The data fork
  1264. > can get trashed in just the same way...
  1265.  
  1266. Another possible reason for corrupting the resource fork is if you fail to
  1267. delete an existing resource before you write a new one with the same type
  1268. and ID.  This will result in multiple resources of the same type and ID
  1269. (i.e., a corrupt resource map).  Of course, if you always delete and
  1270. create a new prefs file from scratch, you're fine.  Also, if you always do
  1271. a GetResource first and simply modify its contents, if it already exist,
  1272. you're also fine.
  1273.  
  1274. -- 
  1275. Scott Lindsey <wombat@claris.com>
  1276. The opinions expressed herein are those of the author and not necessarily those of Claris, Apple, Adobe, Novell, IBM, General Motors, or any other company, government, or organization.
  1277.  
  1278. ---------------------------
  1279.  
  1280. >From ken@zn.ruhr-uni-bochum.de (Ken Flaton)
  1281. Subject: TextBox & Transfer Mode?!
  1282. Date: Mon, 17 Jul 1995 19:47:18 +0200
  1283. Organization: Zentrum fuer Neuroinformatik
  1284.  
  1285.  
  1286. Very briefly: is it possible to write text using TextBox() and get a srcOr
  1287. instead of what looks like a srcCopy for a transfer mode?  This is driving
  1288. me nuts...
  1289.  
  1290. Less briefly: how??
  1291.  
  1292. TIA,
  1293.  
  1294. --ken
  1295.  
  1296.  
  1297. *************************************
  1298. * Dr. Ken Flaton                    *
  1299. * Zentrum fuer Neuroinformatik      *
  1300. * Bochum, Germany                   *
  1301. *                                   *
  1302. * email: ken@zn.ruhr-uni-bochum.de  *
  1303. *************************************
  1304.  
  1305. +++++++++++++++++++++++++++
  1306.  
  1307. >From brians@pbcomputing.com (Brian Stern)
  1308. Date: 18 Jul 1995 04:13:40 GMT
  1309. Organization: The University of Texas at Austin, Austin, Texas
  1310.  
  1311. In article <ken-1707951947180001@fangorn.zn.ruhr-uni-bochum.de>,
  1312. ken@zn.ruhr-uni-bochum.de (Ken Flaton) wrote:
  1313.  
  1314. <Very briefly: is it possible to write text using TextBox() and get a srcOr
  1315. <instead of what looks like a srcCopy for a transfer mode?  This is driving
  1316. <me nuts...
  1317. <
  1318. <Less briefly: how??
  1319. <
  1320. <TIA,
  1321. <
  1322. <--ken
  1323. <
  1324. <
  1325. <*************************************
  1326. <* Dr. Ken Flaton                    *
  1327. <* Zentrum fuer Neuroinformatik      *
  1328. <* Bochum, Germany                   *
  1329. <*                                   *
  1330. <* email: ken@zn.ruhr-uni-bochum.de  *
  1331. <*************************************
  1332.  
  1333. TETextBox does an EraseRect() on the rect that you pass to it before it
  1334. draws the text.  The result is that whatever you ask it to do appears as
  1335. if you've used srcCopy.  DrawString will work for most uses of TETextBox. 
  1336. TETexctBox does give you multiple lines if you need that.  The
  1337. justification it gives you can easily be obtained with DrawString.
  1338.  
  1339. Good luck,
  1340.  
  1341. ____________________________________________________________________
  1342. Brian  Stern  {:-{)}                          BrianS@pbcomputing.com
  1343. Toolbox commando and Menu bard.             Will FlushCache for Cash
  1344.  
  1345. +++++++++++++++++++++++++++
  1346.  
  1347. >From atotic@netscape.com (Aleksandar Totic)
  1348. Date: Tue, 18 Jul 1995 12:01:07 -0800
  1349. Organization: Netscape Communication Corporation
  1350.  
  1351. In article <brians-1707952309480001@slip-7-1.ots.utexas.edu>,
  1352. brians@pbcomputing.com (Brian Stern) wrote:
  1353.  
  1354. > TETextBox does an EraseRect() on the rect that you pass to it before it
  1355. > draws the text.  The result is that whatever you ask it to do appears as
  1356. > if you've used srcCopy.  DrawString will work for most uses of TETextBox. 
  1357. > TETexctBox does give you multiple lines if you need that.  The
  1358. > justification it gives you can easily be obtained with DrawString.
  1359.  
  1360. What is TETexctBox? I was not able to find any references to it in Inside Mac?
  1361.  
  1362. Aleks
  1363. -- 
  1364. Aleksandar Totic
  1365.  
  1366. +++++++++++++++++++++++++++
  1367.  
  1368. >From scouten@metrowerks.com (Eric Scouten)
  1369. Date: Tue, 18 Jul 1995 17:32:43 -0500
  1370. Organization: Metrowerks, Inc.
  1371.  
  1372. In article <atotic-1807951201070001@nonlinear.mcom.com>,
  1373. atotic@netscape.com (Aleksandar Totic) wrote:
  1374.  
  1375. > In article <brians-1707952309480001@slip-7-1.ots.utexas.edu>,
  1376. > brians@pbcomputing.com (Brian Stern) wrote:
  1377. > > TETextBox does an EraseRect() on the rect that you pass to it before it
  1378. > > draws the text.  The result is that whatever you ask it to do appears as
  1379. > > if you've used srcCopy.  DrawString will work for most uses of TETextBox. 
  1380. > > TETexctBox does give you multiple lines if you need that.  The
  1381. > > justification it gives you can easily be obtained with DrawString.
  1382. > What is TETextBox? I was not able to find any references to it in Inside Mac?
  1383.  
  1384. MPTA says its in IM: Text, page 2-88. Feed it a rect and some text and it
  1385. puts said text in the rect.
  1386.  
  1387.    TETextBox(const void* text, short length, const Rect* box, short just);
  1388.  
  1389. -es
  1390.  
  1391. -- 
  1392. __________________________________________________________________________
  1393. Eric Scouten                                       Constructor Constructor
  1394. scouten@metrowerks.com                                     Metrowerks, Inc.
  1395.  
  1396. Don't wake me up 'til my haircut comes back in style.
  1397.  
  1398. +++++++++++++++++++++++++++
  1399.  
  1400. >From peter@adi.co.nz (Peter Bromley)
  1401. Date: Wed, 19 Jul 1995 13:18:33 +1200
  1402. Organization: ADInstruments
  1403.  
  1404. In article <atotic-1807951201070001@nonlinear.mcom.com>,
  1405. atotic@netscape.com (Aleksandar Totic) wrote:
  1406.  
  1407. > In article <brians-1707952309480001@slip-7-1.ots.utexas.edu>,
  1408. > brians@pbcomputing.com (Brian Stern) wrote:
  1409. > What is TETextBox? I was not able to find any references to it in Inside Mac?
  1410.  
  1411. TETextBox is TextBox in new interface clothes. I have wriiten a routine we
  1412. use when doing mode aware text drawing. Readers of csmph might find it
  1413. useful. Pascal only, sorry. It is a little careless about errors but
  1414. should be safe enuf.
  1415.  
  1416. Here 'tis:
  1417.  
  1418. Procedure TETextBoxMode (   text    : Ptr;
  1419.                             length  : LongInt;
  1420.                             box     : Rect;
  1421.                             mode,
  1422.                             just    : Integer);
  1423.  
  1424. Var
  1425.     theTE       : TEHandle;
  1426.     oldMode,
  1427.     atPos,
  1428.     last,
  1429.     index,
  1430.     next,
  1431.     width       : Integer;
  1432.     fontStuff   : FontInfo;
  1433.     
  1434.  
  1435. {TETextBoxMode} begin
  1436.     if (mode = srcCopy) then
  1437.         TETextBox(text, length, box, just)
  1438.     else begin
  1439.         theTE := TENew(box, box);
  1440. {$IFC Undefined NewInterfaces}
  1441.         oldMode := thePort^.txMode;
  1442. {$ELSEC}
  1443.         oldMode := qd.thePort^.txMode;
  1444. {$ENDC}
  1445.         TextMode(mode);
  1446.         if (theTE <> nil) then begin
  1447.             TESetAlignment(just, theTE);
  1448.             TESetText(text, length, theTE);
  1449.             TECalText(theTE);
  1450.             GetFontInfo(fontStuff);
  1451.             atPos := box.Top + fontStuff.leading + fontStuff.ascent;
  1452.             last := 0;
  1453.             for index := 1 to theTE^^.nLines do begin
  1454.                 if (index = theTE^^.nLines) then    { bug in TE means
  1455. lineStarts[nLines] may be unreliable }
  1456.                     next := length
  1457.                 else
  1458.                     next := theTE^^.lineStarts[index];
  1459.                 width := TextWidth(text, last, next - last);
  1460.                 with box do
  1461.                     if (just = TEJustCenter) then
  1462.                         MoveTo((Left + Right - width) div 2, atPos)
  1463.                     else if (just = TEJustRight) then
  1464.                         MoveTo(Right - 1 - width, atPos)
  1465.                     else
  1466.                         MoveTo(Left, atPos);
  1467.                 DrawText(text, last, next - last);
  1468.                 atPos := atPos + theTE^^.lineHeight;
  1469.                 last := next;
  1470.                 end;
  1471.             TEDispose(theTE);
  1472.             end;
  1473.         TextMode(oldMode);
  1474.         end;
  1475.     end;
  1476.  
  1477. -- 
  1478. Peter Bromley                                  (peter@adi.co.nz)
  1479. ADInstruments, Dunedin, New Zealand            
  1480.  
  1481. +++++++++++++++++++++++++++
  1482.  
  1483. >From jwwalker@aol.com (JWWalker)
  1484. Date: 19 Jul 1995 01:35:38 -0400
  1485. Organization: America Online, Inc. (1-800-827-6364)
  1486.  
  1487. Aleksandar Totic wrote:
  1488.  
  1489. > What is TETexctBox? I was not able to find any references to it in
  1490. > Inside Mac?
  1491.  
  1492. I daresay it's a misspelling of TETextBox.   I notice that two other
  1493. people who responded to your message silently fixed the error without
  1494. considering that it might have been the cause of your confusion.
  1495.  
  1496. You might want to look up the article "The TextBox You've Always Wanted" 
  1497. in _develop_ magazine.  Sorry, I don't know what issue.
  1498.  -- Jim Walker
  1499.  
  1500. +++++++++++++++++++++++++++
  1501.  
  1502. >From Maf Vosburgh <maf@mmcorp.com>
  1503. Date: 19 Jul 1995 15:14:46 GMT
  1504. Organization: MMC
  1505.  
  1506. In article <ken-1707951947180001@fangorn.zn.ruhr-uni-bochum.de> Ken
  1507. Flaton, ken@zn.ruhr-uni-bochum.de writes:
  1508. >Very briefly: is it possible to write text using TextBox() and get a srcOr
  1509. >instead of what looks like a srcCopy for a transfer mode?  This is driving
  1510. >me nuts...
  1511.  
  1512. Just install a QuickDraw bottleneck temporarily to suppress the
  1513. EraseRect.
  1514.  
  1515.  
  1516. // takes a c string
  1517.  
  1518. void TextBoxOnBackground(char *s, Rect *r, short justification)
  1519. {
  1520.         CQDProcs        myProcs;
  1521.         CQDProc         *oldProcs = qd.thePort->grafProcs;
  1522.  
  1523.         SetStdCProcs(&myProcs); 
  1524.         myProcs.rectProc =  = NewQDRectProc(VoidStdRect);
  1525.         qd.thePort->grafProcs = &myProcs;
  1526.         
  1527.         TextBox(s, strlen(s), r, justification);
  1528.         
  1529.         qd.thePort->grafProcs = oldProcs;
  1530.         DisposeRoutineDescriptor((UniversalProcPtr)myProcs.rectProc);
  1531. }
  1532.  
  1533. pascal void     VoidStdRect(GrafVerb verb, Rect *r)
  1534. {
  1535.                 // Do nothing at all.
  1536. }
  1537.  
  1538.  
  1539.  
  1540.  
  1541.  
  1542. Maf Vosburgh
  1543. - -------------------------------------------------------------
  1544. Real QT experts just use MoviePlayer, Dumpster & ConvertToMovie.
  1545. Real C programmers use [0]-> (and it's called "sprong").
  1546.  
  1547. +++++++++++++++++++++++++++
  1548.  
  1549. >From Ben Hekster <heksterb@netvision.net.il>
  1550. Date: 20 Jul 1995 04:41:49 GMT
  1551. Organization: NetVision USENET Site.
  1552.  
  1553. In article <ken-1707951947180001@fangorn.zn.ruhr-uni-bochum.de> Ken
  1554. Flaton, ken@zn.ruhr-uni-bochum.de writes:
  1555. > Very briefly: is it possible to write text using TextBox() and get a
  1556. srcOr
  1557. > instead of what looks like a srcCopy for a transfer mode?  This is
  1558. driving
  1559. > me nuts...
  1560.  
  1561. For some reason TEUpdate does an EraseRect on the destination even when
  1562. the mode is srcOr.  Two ways I know of fixing this are to either
  1563. temporarily patch out EraseRect or replace the QD bottleneck procedure
  1564. around the call to TEUpdate (or TextBox).  I've personally only tried the
  1565. former, but I know of someone who did the bottleneck thing, so both
  1566. 'solutions' seem to work.
  1567.  
  1568. Ben
  1569.  
  1570. +++++++++++++++++++++++++++
  1571.  
  1572. >From slasley@space.umd.edu (Scott E. Lasley)
  1573. Date: Thu, 27 Jul 1995 15:56:39 -0400
  1574. Organization: University of Maryland Space Physics Group
  1575.  
  1576. you can also find code for a better TextBox in issue 9 of develop magazine.  
  1577. if you don't subscribe to develop, look on Apple's ftp sites for code from 
  1578. develop.  i you acan also oder back issues from dev.subs@applelink.com.
  1579.  
  1580. hope this helps,
  1581.  
  1582.  
  1583. scott lasley   slasley@space.umd.edu, http://space.umd.edu
  1584. "Cheating is bad.  Richard Basehart is good."  MST3K
  1585.  
  1586.  
  1587. ---------------------------
  1588.  
  1589. >From Roy@AdeptSolutions.com (Roy Lovejoy)
  1590. Subject: WOW. Was: Man, is image manipulation ugly in Pascal!
  1591. Date: Sat, 29 Jul 1995 01:31:47 GMT
  1592. Organization: Adept Solutions
  1593.  
  1594. In article <catambay-2507950753260001@129.197.23.12>, catambay@aol.com
  1595. (Bill the Cat) wrote:
  1596.  
  1597. > In article <quinn-2507951019530001@mac167.cs.uwa.oz.au>,
  1598. > quinn@cs.uwa.edu.au (Quinn "The Eskimo!") wrote:
  1599. > > In article <Roy-2207951714150001@adept.cts.com>, Roy@AdeptSolutions.com
  1600. > > (Roy Lovejoy) wrote:
  1601. > > 
  1602. > > >or better yet, avoid the strip address problem
  1603. > > >
  1604. > > >{
  1605. > > >char  *p = initial_location;
  1606. > > >long count = num_bytes;
  1607. > > >   
  1608. > > >   while (count--)
  1609. > > >      *p = ~*p++;
  1610. > > >}
  1611. > >
  1612. > What are all those funky looking symbols?  Reminds me of APL.
  1613.  
  1614. Umm..I don't see any funky symbols... Looks like standard K&R. 
  1615. Oh.. you must mean the +. It adds two expressions together. It's pretty handy.
  1616. Oh, do you mean the -. It subtracts.
  1617. The * ?? It's like a ^ in pascal. (you might never have derefernced a pointer.)
  1618. The ~ ?? It's like BITOR()..only easier to type, without closing parenthesis.
  1619. HMMM... you must have had line noise if you saw any funky symbols...
  1620.  
  1621.  
  1622. > No flames here.  A standing ovation would be more in line.  
  1623.  
  1624. Yeah. right.
  1625.  
  1626. Its strange that someone who even knows of the EXISTANCE of APL, would be
  1627. 'amazed' by textbook C.
  1628.  
  1629. Note the smiley, saved for last -> ;)
  1630. - -------------------------------------------------------------------
  1631. Roy Lovejoy          PHONE: 619.727.6825  INET:roy@AdeptSolutions.com
  1632. Pixel PooBah           FAX: 619.727.5869   ALINK: ............. adept
  1633. Adept Solutions                              CIS: ........ 72447,1447
  1634. 524 Avenida Verde                         eWorld: ........ adeptsolns
  1635. San Marcos CA 92069                          AOL: ........ adeptsolns
  1636. - -------------------------------------------------------------------
  1637.  
  1638. ---------------------------
  1639.  
  1640. >From dpfeedback@applelink.apple.com (Dan Peterson)
  1641. Subject: [ANN][PTR] Advanced Color Imaging for Toolbox Assistant
  1642. Date: Wed, 26 Jul 1995 09:17:02 -0700
  1643. Organization: Apple Developer Press
  1644.  
  1645. Sorry if you already saw this announcement, but I wasn't sure that it
  1646. actually got posted.
  1647.  
  1648. Now available for the Macintosh Programmer's Toolbox Assistant:
  1649.  
  1650. Advanced Color Imaging Reference
  1651.  
  1652. This new database for the Macintosh Programmer's Toolbox Assistant
  1653. contains information fr these often requested managers that were
  1654. previously unavailable:
  1655.    * Palette Manager
  1656.    * Color Manager
  1657.    * Color Picker Manager
  1658.    * ColorSync
  1659.  
  1660. As always, if you are a current user of Macintosh Programmer's Toolbox
  1661. Assistant, you can download these new files from our web site at:
  1662.  
  1663. http://www.info.apple.com/dev/MPTA.html
  1664.  
  1665.  
  1666. If you aren't a current user of the Macintosh Programmer's Toolbox
  1667. Assistant, it is available from your local bookstore, or through APDA at
  1668. 1-800-282-APDA.
  1669.  
  1670. As always, your comments and suggestions on Toolbox Assistant are always
  1671. welcome. Send them to dpfeedback@applelink.apple.com.
  1672.  
  1673. Hope this helps!
  1674.  
  1675. Dan Peterson,
  1676. Developer Press,
  1677. Apple Computer, Inc.
  1678.  
  1679. ---------------------------
  1680.  
  1681. End of C.S.M.P. Digest
  1682. **********************
  1683.